package code.example.base.gc.gc2;

import code.example.base.gc.Person;
import code.example.tool.LogFactory;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.TimeUnit;

/**
 *   java -Xms512m -Xmx512m -cp ./lib/*:*.jar -XX:+PrintGCDetails -XX:+PrintHeapAtGC code.example.base.gc.gc2.TriggerGC2
 *   场景：LinkedList 中存10000个元素，然后进入循环（添加500个，移除500个），即LinkedList不断的进入移除元素，但总量一直保存 10000个元素，
 *   GC情况:
 *    jvm 数据放到eden 中，eden 100% 触发 minor gc,把eden中引用的放到 其中一个survivor中（from 或 to），清空eden ,survivor能够放下，没有数据进入old.
 *    jvm 数据放到eden 中，eden 100% 触发 minor gc,把eden中引用的放到 其中一个survivor中（from 或 to），清空eden ,survivor能够放下，没有数据进入old.
 *    jvm 数据放到eden 中，eden 100% 触发 minor gc,把eden中引用的放到 其中一个survivor中（from 或 to），清空eden ,survivor能够放下，没有数据进入old.
      minor gc 情况如上，不断重复。未触发full gc.回收后的对象占用survivor 的大小一直为为60-70%。
      minor gc 执行时间很短：约5，6ms.
      GC 情况很好。

      相关问题：
      1.minor gc 执行15次，对象还是存在survivor中，没有进入old。
      （ -XX:MaxTenuringThreshold）默认参数指定是最大 15岁进入old. 猜测原因是对象大小小于survivor大小。
      2. survivor 大小 由 21M 变为 1.5M。
           默认的垃圾回收器是Parallel Scavenge ，它默认开启-XX:+UseAdaptiveSizePolicy参数，即可以动态调整survivor 大小。
            调整原因是：Parallel Scavenge 为了达到某个目标，而调整，
                 :survivor变小--》进入old的机率变大
                 :survivor变大--》进入old的机率变小



 */
public class TriggerGC2 {

    public void test(){
        Queue data = new LinkedList();
        for(int i=0;i<10000;i++){//  增大10000
            Person person = new Person();
            person.setName("TestK"+i);
            data.offer(person);
        }
        for(;;){

            for(int i=0;i<500;i++){
                Person person = new Person();
                person.setName("TestK"+i);
                data.offer(person);
            }
            for(int i=0;i<500;i++){
                data.poll();
            }
            //LogFactory.getLog().info("queue.size="+data.size());
            try {
                TimeUnit.MILLISECONDS.sleep(10);
            }catch (Exception e){}
        }
    }
    public static void main(String [] args){
        new TriggerGC2().test();
    }
}
